home *** CD-ROM | disk | FTP | other *** search
- #include "../CGVPMacro.csi"
-
- AutoEnumTC
-
- MainInput
- {
- uniform sampler2D baseMap : register(sn),
- #if %LM
- uniform sampler2D lightMap : register(sn),
- #elif %DOT3LM
- #if %BUMP_MAP
- uniform sampler2D bumpMap : register(sn),
- #endif
- uniform sampler2D lightMap : register(sn),
- uniform sampler2D lightDirMap : register(sn),
- #endif
- #if %ENVCMAMB
- uniform samplerCUBE envMap : register(sn),
- #elif %ENVCMSPEC
- #if !%DOT3LM && %BUMP_MAP
- uniform sampler2D bumpMap : register(sn),
- #endif
- uniform samplerCUBE envMap : register(sn),
- #if %GLOSS_MAP
- uniform sampler2D glossMap : register(sn),
- #endif
- #endif
- uniform float4 Ambient,
- #if %ENVCMAMB
- uniform float4 Reflect,
- #elif %ENVCMSPEC
- uniform float4 EnvMapParams,
- uniform float4 FresnelParams,
- #endif
- }
-
- DeclarationsScript
- {
- // define outputs from vertex shader
- struct vertout
- {
- float4 HPosition : POSITION;
- float4 baseTC : TEXCOORDN;
- #if %LM
- float4 lmTC : TEXCOORDN;
- #elif %DOT3LM
- #if %BUMP_MAP
- float4 bumpTC : TEXCOORDN;
- #endif
- float4 lmTC : TEXCOORDN;
- float4 lmdirTC : TEXCOORDN;
- #endif
- #if %ENVLIGHT
- float4 Color : COLOR0;
- #elif %ENVCMAMB
- float4 envTC : TEXCOORDN;
- #elif %ENVCMSPEC
- #if !%DOT3LM && %BUMP_MAP
- float4 bumpTC : TEXCOORDN;
- #endif
- float4 viewVec : TEXCOORDN;
- float4 tangVec : TEXCOORDN;
- float4 binormVec : TEXCOORDN;
- float4 normVec : TEXCOORDN;
- #endif
- };
-
- FOUT
- }
- CoreScript
- {
- // load the decal
- half4 decalColor = tex2D(baseMap, IN.baseTC.xy);
-
- // Compute diffuse contribution
- #if %LM
- // load the lm
- half4 lmColor = tex2D(lightMap, IN.lmTC.xy);
- half3 dif = (decalColor.xyz * lmColor.xyz) * 4;
- #elif %DOT3LM
- #if %BUMP_MAP
- // load the bump normal
- float4 bumpNormal = 2*(tex2D(bumpMap, IN.bumpTC.xy)-0.5);
- #else
- float4 bumpNormal = float4(0,0,1,1);
- #endif
- // load the lm
- half4 lmColor = tex2D(lightMap, IN.lmTC.xy);
- // load the lm dir
- float4 lmDir = 2*(tex2D(lightDirMap, IN.lmdirTC.xy)-0.5);
- #if %BUMP_NORMALIZE && %BUMP_MAP
- // normalize post-filtered bump normals
- bumpNormal.xyz = normalize(bumpNormal.xyz);
- #endif
- float NdotL = saturate(dot(lmDir.xyz, bumpNormal.xyz));
- half lmIntens = NdotL * lmColor.a + (1-lmColor.a);
- half3 dif = (decalColor.xyz * lmColor.xyz * lmIntens) * 4;
- #else
- half3 dif = float3(0,0,0);
- #endif
-
- // Compute ambient contribution
- #if %ENVLIGHT
- half3 amb = decalColor.xyz * IN.Color.xyz;
- #elif %ENVCMAMB
- // load the environment map
- half4 envColor = texCUBE(envMap, IN.envTC.xyz);
- half3 amb = lerp(decalColor.xyz*Ambient.xyz, envColor.xyz, Reflect.a);
- #elif %ENVCMSPEC
- #if !%DOT3LM
- #if %BUMP_MAP
- // load the bump normal
- float4 bumpNormal = 2*(tex2D(bumpMap, IN.bumpTC.xy)-0.5);
- #if %BUMP_NORMALIZE
- // normalize post-filtered bump normals
- bumpNormal.xyz = normalize(bumpNormal.xyz);
- #endif
- #else
- float4 bumpNormal = float4(0,0,1,1);
- #endif
- #endif
- half fEnvmapContrast = EnvMapParams.x;
- half fEnvmapSaturation = EnvMapParams.y;
- half fEnvmapAmount = EnvMapParams.z;
-
- float fFresnelScale = FresnelParams.x;
- float fFresnelBias = FresnelParams.y;
- float fFresnelPow = FresnelParams.z;
-
- // Calc Reflection Vector
- float3x3 worldTangentSpace;
- worldTangentSpace[0] = IN.tangVec.xyz;
- worldTangentSpace[1] = IN.binormVec.xyz;
- worldTangentSpace[2] = IN.normVec.xyz;
-
- float3 viewVec = normalize(IN.viewVec.xyz);
- float NdotE = dot(bumpNormal.xyz, viewVec);
- float3 reflectVect = (2.0*NdotE*bumpNormal.xyz)-(dot(bumpNormal.xyz, bumpNormal.xyz)*viewVec);
- float3 worldReflectVec = mul(reflectVect, worldTangentSpace);
-
- // Calc Fresnel factor
- half fresnel = fFresnelBias + (pow((1-NdotE), fFresnelPow) * fFresnelScale);
-
- // Calc environment
- half3 env = texCUBE(envMap, worldReflectVec).xyz * fEnvmapAmount;
- half3 envSquared = env * env;
- env = lerp(env, envSquared, fEnvmapContrast);
- half3 greyScale = dot(env, half3(0.33, 0.59, 0.11));
- env = lerp(greyScale, env, fEnvmapSaturation) * fresnel;
- #if GLOSS_MAP
- // load the gloss
- half4 glossColor = tex2D(glossMap, IN.baseTC.zw);
- env *= glossColor.xyz;
- #endif
- half3 amb = decalColor.xyz * Ambient.xyz + env;
- #else
- half3 amb = decalColor.xyz * Ambient.xyz;
- #if %ALPHAGLOW
- amb += decalColor.w * decalColor.xyz;
- #endif
- #endif
-
- // finally add them all together
- OUT.Color.xyz = amb + dif;
- #if %ALPHAGLOW && %DOT3LM
- // Fake (for compatibility with old system)
- // Should be removed
- OUT.Color.w = decalColor.w * Ambient.w;
- #elif !%ALPHAGLOW && %DIFFUSEALPHA
- OUT.Color.w = decalColor.w * Ambient.w;
- #else
- OUT.Color.w = Ambient.w;
- #endif
- }